class EventEmitter {
  constructor() {
    this._events = {};
  }
  on(eventName, fn) {
    // 如果检测到没有，则新建一个
    if (!this._events) {
      // 创建一个干净的对象
      this._events = Object.create(null);
    }

    // 当前绑定的事件不是newListenner就触发一下newListenner这个事件
    if (eventName !== 'newListenner') {
      this.emit('newListenner', eventName);
    }

    if (!this._events[eventName]) {
      this._events[eventName] = [fn];
    } else {
      this._events[eventName].push(fn);
    }
  }
  emit(eventName, ...args) {
    if (!this._events) return;
    if (this._events[eventName]) {
      this._events[eventName].forEach((fn) => fn(...args));
    }
  }
  once(eventName, fn) {
    const once = (...args) => {
      fn(...args);
      // 当绑定后再移除自己
      this.off(eventName, once);
    };
    // 用来标识这个once是谁的
    once.l = fn;
    this.on(eventName, once);
  }
  off(eventName, fn) {
    if (!this._events) return;
    this._events[eventName] = this._events[eventName].filter((item) => {
      return item !== fn && item.l != fn;
    });
  }
}

module.exports = EventEmitter;
